﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using SSDPNET.DataCore;
using ATEC.ATDataCoreNET;
using ATEC.GeometryNET;
using ATEC.ATDataCoreNET.ATCCL;
using ATEC.ATDataCoreNET.ATObjects;
using ATEC.CCLObj.Entity;
using ATEC.CCLObj.CCFWork;
using System.Security.Cryptography;


namespace CCFWorkExample
{
    /// <summary>
    /// 类名：CCFWorkTestForm
    /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作
    /// 功能：展示如何在玄镜平台中进行CCF属性的创建、查询、修改等操作
    /// 关键类及说明：
    ///     - ATObject：平台对象基类，用于承载CCF属性
    ///     - ICCFWork：CCF工作集接口，管理CCF属性定义
    ///     - ATCCLManager：CCF属性管理器，提供属性操作的核心功能
    ///     - ICCLEntity：CCF实体接口，表示具体的CCF属性实例
    /// </summary>
    public partial class CCFWorkTestForm : Form
    {
        private ATObject currObj = null;  // 当前操作的对象实例，用于属性演示

        public CCFWorkTestForm()
        {
            InitializeComponent();  // 初始化窗体组件
        }

        /// <summary>
        /// 方法名：button_ImportCCFWork_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/导入
        /// 功能：从数据库文件中导入CCFWork工作集到当前项目
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// 关键类及说明：
        ///     - ATCCLManager：CCF属性管理器，提供导入功能
        ///     - ICCFWork：表示导入的CCF工作集
        /// </summary>
        private void button_ImportCCFWork_Click(object sender, EventArgs e)
        {
            OpenFileDialog OP = new OpenFileDialog();  // 创建文件选择对话框
            OP.ShowDialog();  // 显示文件选择对话框
            string fileName = OP.FileName;  // 获取选择的文件路径
            if (string.IsNullOrEmpty(fileName))  // 检查文件名是否为空
                return;

            ATSceneRef scene = SSDPNET.ScenesFunctions.SceneRefGetActive();  // 获取当前活动场景
            ATProject project = scene.GetATProject();  // 获取当前项目

            ATCCLManager manger = ATCCLManager.Manager;  // 获取CCF管理器实例
            ICCFWork ccfwork;  // 声明CCFWork接口变量
            string Err;  // 用于存储错误信息
            if (StatusInt.Success!=manger.ImportDBCCFWork(out ccfwork, fileName, project, false, true, out Err))  // 执行导入操作
                MessageBox.Show("导入失败");  // 显示导入失败提示
            MessageBox.Show("导入成功");  // 显示导入成功提示
            return;
        }

        /// <summary>
        /// 方法名：button_showAllCCFWork_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/查询
        /// 功能：显示当前项目中所有CCFWork的名称
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// 关键类及说明：
        ///     - ATCCLManager：用于发现和管理CCF工作集
        ///     - RefdSceneScopeOption：定义搜索范围的选项
        /// </summary>
        private void button_showAllCCFWork_Click(object sender, EventArgs e)
        {
            ATSceneRef scene = SSDPNET.ScenesFunctions.SceneRefGetActive();  // 获取当前活动场景
            ATProject propject = scene.GetATProject();  // 获取当前项目
            ATCCLManager manger = ATCCLManager.Manager;  // 获取CCF管理器实例
            string allCCFWork = "";  // 初始化存储所有CCFWork名称的字符串

            foreach (string name in manger.DiscoverCCLans(propject, RefdSceneScopeOption.All, true))  // 遍历所有CCFWork
            {
                allCCFWork += name;  // 添加CCFWork名称
                allCCFWork += "\n";  // 添加换行符
            }
            MessageBox.Show(allCCFWork);  // 显示所有CCFWork名称
        }

        /// <summary>
        /// 方法名：button_ShowCCFWorkInfo_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/查询
        /// 功能：读取并显示当前所有的CCFWork和CCLan信息
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// 关键类及说明：
        ///     - ICCFWork：CCF工作集接口
        ///     - ICCLan：CCL属性定义接口
        ///     - FindEntitysScopeOption：查找范围选项
        /// </summary>
        private void button_ShowCCFWorkInfo_Click(object sender, EventArgs e)
        {
            ATSceneRef scene = SSDPNET.ScenesFunctions.SceneRefGetActive();  // 获取当前活动场景
            ATProject propject = scene.GetATProject();  // 获取当前项目
            ATCCLManager manger = ATCCLManager.Manager;  // 获取CCF管理器实例
            ICCFWork ccfWork = null;  // 声明CCFWork接口变量

#if true
            // 读取当前所有的ccfwork
            IList<ICCFWork> ccfWorks = manger.DiscoverCCFWorksForScene(scene.GetRoot(), RefdSceneScopeOption.All, true);  // 获取所有CCFWork
            for (int i = 0; i < ccfWorks.Count; i++)  // 遍历所有CCFWork
            {
                string nameTmp = ccfWorks[i].Name;  // 获取CCFWork名称
                int versionMajor = ccfWorks[i].VersionMajor;  // 获取主版本号
                int versionMinor = ccfWorks[i].VersionMinor;  // 获取次版本号
                if (nameTmp == "SSDPNETExample")  // 查找指定名称的CCFWork
                {
                    ccfWork = ccfWorks[i];  // 保存找到的CCFWork
                    break;  // 结束循环
                }
            }
#endif
            FindEntitysScopeOption option = new FindEntitysScopeOption(ATCCLHostType.File, true);  // 创建查找范围选项
            FindEntitysScope scope = FindEntitysScope.CreateScope(propject, option);  // 创建查找范围
            ccfWork = manger.LocateCCLanInScope(scope, "SSDPNETExample", 1, 0, CCLanMatchType.LatestCompatible);  // 在范围内定位CCFWork
            if (ccfWork == null)  // 检查是否找到CCFWork
                return;

            // 读取ccfwork中所有的cclan
            ICCLan[] cclans = ccfWork.GetCCLans();  // 获取所有CCLan
            string cclanInfoALL = "";  // 初始化信息字符串
            for (int i = 0; i < cclans.Length; i++)  // 遍历所有CCLan
            {
                ICCLan cclan = cclans[i];  // 获取当前CCLan
                string propertys = "";  // 初始化属性字符串
                foreach (ICCLProps prop in cclan)  // 遍历CCLan的所有属性
                {
                    string propertyInfo = string.Format("{0}:{1}\n", prop.Name, prop.Type.Name);  // 格式化属性信息
                    propertys += propertyInfo;  // 添加属性信息
                }
                string cclanInfo = string.Format("{0}\nproperties\n{1}", cclan.Name, propertys);  // 格式化CCLan信息
                cclanInfoALL += cclanInfo;  // 添加CCLan信息
            }

            MessageBox.Show(cclanInfoALL);  // 显示所有信息
        }
        
        /// <summary>
        /// 方法名：Add_Manual
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/创建
        /// 功能：手动方式为对象添加CCF属性实例
        /// 参数：
        ///     - obj：要添加属性的ATObject对象
        /// 返回值：无
        /// 关键类及说明：
        ///     - ATCCLEntityEnabler：CCF属性实例使能器
        ///     - ICCLEntity：CCF属性实例接口
        /// </summary>
        private void AddInstanceOnObj(ATObject obj)
        {
            Add_Manual(obj);

            Add_EasyCCF(obj);
        }

        /// <summary>
        /// 方法名：Add_Manual
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/创建
        /// 功能：手动方式为对象添加CCF属性实例
        /// 参数：
        ///     - obj：要添加属性的ATObject对象
        /// 返回值：无
        /// 关键类及说明：
        ///     - ATCCLEntityEnabler：CCF属性实例使能器
        ///     - ICCLEntity：CCF属性实例接口
        /// </summary>
        private void Add_Manual(ATObject obj)
        {
            ATSceneRef scene = SSDPNET.ScenesFunctions.SceneRefGetActive();  // 获取当前活动场景
            ATProject file = scene.GetATProject();  // 获取当前项目
            ATCCLManager manger = ATCCLManager.Manager;  // 获取CCF管理器实例

            //首先需要拿到enabler
            ATCCLEntityEnabler enable = manger.ObtainEntityEnablerByName(CCFWorkTestStruct.cclName, CCFWorkTestStruct.cclanName, file);  // 获取属性使能器
            if (enable == null)  // 检查使能器是否获取成功
                return;

            //从cclan中创建新的instance
            ATEC.CCLObj.Entity.ICCLEntity entity = enable.CCLan.CreateEntity();  // 创建新的属性实例

            //属性值定义
            CCFWorkTestStruct testStruct = new CCFWorkTestStruct();  // 创建测试结构体
            testStruct.Length = 30;  // 设置长度属性
            testStruct.Color = "black";  // 设置颜色属性
            testStruct.ObjId = obj.ObjectId;  // 设置对象ID
            testStruct.PtStart = new XPoint3d(0, 0, 10);  // 设置起点坐标
            testStruct.SubCrv = new CurveSet(CurveSet.BoundaryType.Open);  // 创建曲线集合
      
            testStruct.SubCrv = CurveSet.CreateLinear(new List<XPoint3d> { new XPoint3d(0, 0, 0), new XPoint3d(0, 0, 100) },
                CurveSet.BoundaryType.Open, false);  // 创建线性曲线
            testStruct.AllPts = new List<XPoint3d>() { new XPoint3d(0, 0, 0), new XPoint3d(0, 0, 100) };  // 设置点集合
            testStruct.UserDatas = new List<UserDefinedClass> { new UserDefinedClass(0, 0), new UserDefinedClass(1, 1) };  // 设置用户数据
            testStruct.testMultiStruct.Index = 55;  // 设置多层结构体索引
            testStruct.testMultiStruct.Fraction = 0.5;  // 设置多层结构体分数
            testStruct.testMultiStruct.secondLayer.Index = 44;  // 设置二层结构体索引
            testStruct.testMultiStruct.secondLayer.Fraction = 0.6;  // 设置二层结构体分数
            
            //属性值写入instance
            testStruct.SaveToInstance(ref entity);  // 将属性值保存到实例中
            //属性绑定到obj
            enable.CreateEntityOnObject(obj, entity, true);  // 将属性实例绑定到对象上
        }

        /// <summary>
        /// 方法名：Add_EasyCCF
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/创建
        /// 功能：使用EasyCCF方式为对象添加CCF属性实例
        /// 参数：
        ///     - obj：要添加属性的ATObject对象
        /// 返回值：无
        /// 关键类及说明：
        ///     - EasyCCFTestStruct：简化的CCF属性结构体
        ///     - SSDPObject.EasyCCF：简化的CCF操作工具类
        /// </summary>
        private void Add_EasyCCF(ATObject obj)
        {
            //属性值定义
            EasyCCFTestStruct Outter = new EasyCCFTestStruct();  // 创建测试结构体
            Outter.Length = 33;  // 设置长度属性
            Outter.Color = "black";  // 设置颜色属性
            Outter.ElemId = obj.ObjectId;  // 设置元素ID
            Outter.PtStart = new XPoint3d(10, 20, 30);  // 设置起点坐标

            Outter.SubCrv = new CurveSet(CurveSet.BoundaryType.Open);  // 创建曲线集合
            Outter.SubCrv = CurveSet.CreateLinear(new List<XPoint3d> { new XPoint3d(0, 0, 0), new XPoint3d(0, 0, 100) },
                CurveSet.BoundaryType.Open, false);  // 创建线性曲线

            Outter.AllPts = new List<XPoint3d>() { new XPoint3d(1, 2, 3), new XPoint3d(4, 5, 6) };  // 设置点集合
            Outter.ListNest1 = new List<EasyCCFTestNest1>  // 设置嵌套列表
            {
                new EasyCCFTestNest1()  // 创建第一个嵌套对象
                {
                    Nest1_Index = 8,  // 设置索引
                    Nest1_Fraction = 8.8,  // 设置分数
                },
                new EasyCCFTestNest1()  // 创建第二个嵌套对象
                {
                    Nest1_Index = 9,  // 设置索引
                    Nest1_Fraction = 9.9,  // 设置分数
                }
            };

            Outter.Nest1.Nest1_Index = 55;  // 设置嵌套结构体索引
            Outter.Nest1.Nest1_Fraction = 0.5;  // 设置嵌套结构体分数
            Outter.Nest1.Nest2.Nest2_Index = 66;  // 设置二层嵌套结构体索引
            Outter.Nest1.Nest2.Nest2_Fraction = 0.6;  // 设置二层嵌套结构体分数

            // 属性值绑定到obj
            SSDPObject.EasyCCF.ToCCF(Outter, obj);  // 使用EasyCCF将属性绑定到对象
        }

        /// <summary>
        /// 方法名：QueryPropertyOnObj
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/查询
        /// 功能：查询对象上的CCF属性
        /// 参数：
        ///     - obj：要查询的ATObject对象
        /// 返回值：无
        /// 关键类及说明：
        ///     - ATObject：平台对象基类
        /// </summary>
        private void QueryPropertyOnObj(ATObject obj)
        {
            Query_Manual(obj);  // 手动方式查询属性

            Query_EasyCCF(obj);  // 使用EasyCCF方式查询属性
        }

        /// <summary>
        /// 方法名：Query_Manual
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/查询
        /// 功能：手动方式查询对象的CCF属性
        /// 参数：
        ///     - obj：要查询的ATObject对象
        /// 返回值：无
        /// 关键类及说明：
        ///     - IATCCLEntity：CCF属性实例接口
        ///     - ATCCLManager：CCF属性管理器
        /// </summary>
        private void Query_Manual(ATObject obj)
        {
            if (obj == null)  // 检查对象是否为空
                return;
            ATCCLManager manger = ATCCLManager.Manager;  // 获取CCF管理器实例

            //根据cclan名称获取obj中挂接的instance
            IATCCLEntity entity = manger.FindInstanceOnObjectByName(obj, CCFWorkTestStruct.cclName, CCFWorkTestStruct.cclanName);  // 查找属性实例
            if (entity == null)  // 检查是否找到属性实例
                return;

            //从instance中读取属性值
            CCFWorkTestStruct structQuery = new CCFWorkTestStruct();  // 创建结构体对象
            structQuery.LoadEntity(entity);  // 从实例中加载属性值

            MessageBox.Show("读取成功");  // 显示成功消息
        }

        /// <summary>
        /// 方法名：Query_EasyCCF
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/查询
        /// 功能：使用EasyCCF方式查询对象的CCF属性
        /// 参数：
        ///     - obj：要查询的ATObject对象
        /// 返回值：无
        /// 关键类及说明：
        ///     - EasyCCFTestStruct：简化的CCF属性结构体
        ///     - SSDPObject.EasyCCF：简化的CCF操作工具类
        /// </summary>
        private void Query_EasyCCF(ATObject obj)
        {
            // 从instance中读取属性值
            EasyCCFTestStruct outStruct = new EasyCCFTestStruct();  // 创建结构体对象
            SSDPObject.EasyCCF.FromCCF(outStruct, obj);  // 从对象中读取属性值
            MessageBox.Show("EasyCCF 读取成功");  // 显示成功消息
        }

        /// <summary>
        /// 方法名：button_CreateLine_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/创建
        /// 功能：创建一个带自定义属性的线段对象
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// 关键类及说明：
        ///     - CurveSet：曲线集合类
        ///     - GeometryToATObject：几何对象转换工具类
        /// </summary>
        private void button_CreateLine_Click(object sender, EventArgs e)
        {
            //创建线串
            XPoint3d p0 = XPoint3d.Zero;  // 创建起点（原点）
            XPoint3d p1 = new XPoint3d(150, 0, 0);  // 创建终点
            p0.X = -150;  // 修改起点X坐标
            p0.Y = 20;  // 修改起点Y坐标
            p1.Y = 20;  // 修改终点Y坐标
            XSegment3d line = new XSegment3d(p0, p1);  // 创建线段
            CurveSet.BoundaryType BndryType = CurveSet.BoundaryType.None;  // 设置边界类型
            CurveSet curveSetLine = CurveSet.Create(BndryType);  // 创建曲线集合
            curveSetLine.Add(BasicCurve.CreateLine(line));  // 添加线段到曲线集合

            if (curveSetLine == null)  // 检查曲线集合是否创建成功
            {
                return;
            }
            //获取当前激活Scene
            ATSceneRef scene = SSDPNET.ScenesFunctions.SceneRefGetActive();  // 获取当前场景

            //将直线显示在视口
            ATEC.ATDataCoreNET.ATObjects.ATObject curveSetObj =
             ATEC.ATDataCoreNET.ATObjects.GeometryToATObject.ToObject(scene.GetATScene(), curveSetLine, null);  // 转换为平台对象
            ObjectPropertiesSetter setter = new ObjectPropertiesSetter();  // 创建属性设置器
            setter.SetColor((uint)3);  // 设置颜色
            setter.Apply(curveSetObj);  // 应用属性设置
            if (StatusInt.Success == curveSetObj.AddToScene())  // 添加对象到场景
            {
                //属性挂接到线串curveSetObj中
                AddInstanceOnObj(curveSetObj);  // 添加属性实例
                currObj = curveSetObj;  // 保存当前对象引用
            }

            MessageBox.Show("创建成功");  // 显示成功消息
        }

        /// <summary>
        /// 方法名：button_QueryCurrObj_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/查询
        /// 功能：查询当前对象的属性信息
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// 说明：需要先创建对象才能查询
        /// </summary>
        private void button_QueryCurrObj_Click(object sender, EventArgs e)
        {
            if (currObj != null)  // 检查当前对象是否存在
            {
                QueryPropertyOnObj(currObj);  // 查询对象属性
            }
        }

        /// <summary>
        /// 方法名：button_GetAllObj_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/查询
        /// 功能：根据属性名查询所有的对象
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// 关键类及说明：
        ///     - ATCCLEntityCollection：CCF属性实例集合
        /// </summary>
        private void button_GetAllObj_Click(object sender, EventArgs e)
        {
            ATSceneRef scene = SSDPNET.ScenesFunctions.SceneRefGetActive();  // 获取当前活动场景
            ATProject file = scene.GetATProject();  // 获取当前项目
            ATCCLManager manger = ATCCLManager.Manager;  // 获取CCF管理器实例
            
            //查询到所有的instance
            ATCCLEntityCollection collection = manger.FindAllInstanceByName(file, CCFWorkTestStruct.cclName, CCFWorkTestStruct.cclanName);  // 查找所有实例
            if (collection == null)  // 检查集合是否为空
                return;
            
            string objId = "";  // 初始化对象ID字符串
            foreach(IATCCLEntity entity in collection)  // 遍历所有实例
            {
                //instance中可以取到相关的Object
                objId += entity.Object.ObjectId.ToString();  // 添加对象ID
                objId += ";";  // 添加分隔符
            }

            MessageBox.Show(objId);  // 显示所有对象ID
        }

        /// <summary>
        /// 方法名：button_ModifyValue_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/修改
        /// 功能：修改当前对象的属性值
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// 关键类及说明：
        ///     - ICCLEntity：CCF属性实例接口
        /// </summary>
        private void button_ModifyValue_Click(object sender, EventArgs e)
        {
            if (currObj == null)  // 检查当前对象是否存在
                return;
            ATCCLManager manger = ATCCLManager.Manager;  // 获取CCF管理器实例
            
            //拿到Object上的instance
            IATCCLEntity entity = manger.FindInstanceOnObjectByName(currObj, CCFWorkTestStruct.cclName, CCFWorkTestStruct.cclanName);  // 获取属性实例
            if (entity == null)  // 检查实例是否存在
                return;

            ICCLEntity instanceSaved = (ICCLEntity)entity;  // 转换实例类型
            CCFWorkTestStruct structQuery = new CCFWorkTestStruct();  // 创建结构体对象
            
            //数据读取并修改
            structQuery.LoadEntity(entity);  // 加载实例数据
            structQuery.Color = "Red";  // 修改颜色属性

            //修改内容返回到instance中
            structQuery.SaveToInstance(ref instanceSaved);  // 保存修改后的数据

            //修改写入到磁盘
            entity.WriteChanges();  // 将修改写入磁盘
        }

        /// <summary>
        /// 方法名：btnNoGraphicPropAdd_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/非图形属性
        /// 功能：添加非图形属性到场景
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// 关键类及说明：
        ///     - ATNonGraphicObject：非图形对象基类
        ///     - CubicProperty：立方体属性类
        /// </summary>
        private void btnNoGraphicPropAdd_Click(object sender, EventArgs e)
        {
            ATSceneRef scene = SSDPNET.ScenesFunctions.SceneRefGetActive();  // 获取当前活动场景
            ATNonGraphicObject currNonGraphicObject = new CubicProperty(scene);  // 创建非图形对象
            currNonGraphicObject.AddToScene();  // 添加到场景
        }

        /// <summary>
        /// 方法名：btnNoGraphicPropQuery_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/非图形属性
        /// 功能：查询场景中的非图形属性
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// 关键类及说明：
        ///     - ATNonGraphicObject：非图形对象基类
        ///     - CubicProperty：立方体属性类
        /// </summary>
        private void btnNoGraphicPropQuery_Click(object sender, EventArgs e)
        {
            ATSceneRef scene = SSDPNET.ScenesFunctions.SceneRefGetActive();  // 获取当前活动场景
            ATProject file = scene.GetATProject();  // 获取当前项目
            ATCCLManager manger = ATCCLManager.Manager;  // 获取CCF管理器实例

            //查询到所有的instance
            ATCCLEntityCollection collection = manger.FindAllInstanceByName(file, CubicProperty.cclName, CubicProperty.cclanName);  // 查找所有实例
            if (collection == null)  // 检查集合是否为空
                return;

            foreach (IATCCLEntity entity in collection)  // 遍历所有实例
            {
                //序列化元素
                ATNonGraphicObject aTNonGraphicObject =  ATNonGraphicObject.Create(entity.Object);  // 创建非图形对象
                if (aTNonGraphicObject is CubicProperty)  // 检查对象类型
                {
                    CubicProperty cubicProperty = aTNonGraphicObject as CubicProperty;  // 转换为立方体属性对象
                    MessageBox.Show("读取成功");  // 显示成功消息
                }
            }
        }

        /// <summary>
        /// 方法名：btn_AddProp_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/外部属性
        /// 功能：添加外部属性
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// </summary>
        private void btn_AddProp_Click(object sender, EventArgs e)
        {
            ExtrinsicProperty.AddProp();  // 调用外部属性添加方法
        }

        /// <summary>
        /// 方法名：btn_QueryProp_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/外部属性
        /// 功能：查询外部属性
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// </summary>
        private void btn_QueryProp_Click(object sender, EventArgs e)
        {
            ExtrinsicProperty.QueryProp();  // 调用外部属性查询方法
        }

        /// <summary>
        /// 方法名：btn_QueryAllProp_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/外部属性
        /// 功能：查询所有外部属性
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// </summary>
        private void btn_QueryAllProp_Click(object sender, EventArgs e)
        {
            ExtrinsicProperty.QueryAllProp();  // 调用查询所有外部属性方法
        }

        /// <summary>
        /// 方法名：btn_RemoveProp_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/外部属性
        /// 功能：移除外部属性
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// </summary>
        private void btn_RemoveProp_Click(object sender, EventArgs e)
        {
            ExtrinsicProperty.RemoveProp();  // 调用移除外部属性方法
        }

        /// <summary>
        /// 方法名：btn_RemoveAllProp_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/外部属性
        /// 功能：移除所有外部属性
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// </summary>
        private void btn_RemoveAllProp_Click(object sender, EventArgs e)
        {
            ExtrinsicProperty.RemoveAllProp();  // 调用移除所有外部属性方法
        }

        /// <summary>
        /// 方法名：btn_ChosenStandard_Click
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/CCF属性操作/标准
        /// 功能：显示当前项目标准
        /// 参数：
        ///     - sender：事件发送者
        ///     - e：事件参数
        /// 返回值：无
        /// </summary>
        private void btn_ChosenStandard_Click(object sender, EventArgs e)
        {
            string s = CollaborateTools.GlobalManagementForm.CurrentProjectStandard;  // 获取当前项目标准
            MessageBox.Show(s);  // 显示项目标准
        }
    }
}
